package cn.com.smart.framework.aspectj;

import java.lang.reflect.Method;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import cn.com.smart.common.utils.StringUtils;
import cn.com.smart.framework.aspectj.lang.annotation.DataSource;
import cn.com.smart.framework.datasource.DynamicDataSourceContextHolder;

/**
 * 多数据源处理
 * 
 */
@Aspect
@Order(1)
@Component
public class DataSourceAspect {
	protected Logger log = LoggerFactory.getLogger(getClass());

	@Pointcut("@within(cn.com.smart.framework.aspectj.lang.annotation.DataSource)")
	public void dsPointCut() {

	}

	@Around("dsPointCut()")
	public Object around(ProceedingJoinPoint point) throws Throwable {
		MethodSignature signature = (MethodSignature) point.getSignature();
		Method method = signature.getMethod();
		
		DataSource dataSource = method.getAnnotation(DataSource.class);
		if (StringUtils.isNullOrEmpty(dataSource)) {
			//判断类上面是否有注解
			if(method.getDeclaringClass().isAnnotationPresent(DataSource.class)) {
				dataSource = method.getDeclaringClass().getDeclaredAnnotation(DataSource.class);
			}
		}
		if (StringUtils.isNotNull(dataSource)) {
			log.info("mapper [ class = {}, method = {} ] execute datasource:{}", method.getDeclaringClass().getName(), method.getName(),dataSource.value());
			DynamicDataSourceContextHolder.setDataSourceType(dataSource.value());
		}

		try {
			return point.proceed();
		} finally {
			// 销毁数据源 在执行方法之后
			DynamicDataSourceContextHolder.clearDataSourceType();
		}
	}
}
